package com.ruoyi.xuexiao.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.xuexiao.domain.param.KsFileDtoParam;
import com.ruoyi.xuexiao.domain.entity.KsJbxxhz;
import com.ruoyi.xuexiao.domain.entity.KsYgJct;
import com.ruoyi.xuexiao.domain.param.KsYgJctRequestParam;
import com.ruoyi.xuexiao.domain.vo.KsYgJctReturnVo;
import com.ruoyi.xuexiao.mapper.KsJbxxhzMapper;
import com.ruoyi.xuexiao.mapper.KsYgJctMapper;
import com.ruoyi.xuexiao.service.KsYgJctService;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Service
public class KsYgJctImpl extends ServiceImpl<KsYgJctMapper, KsYgJct>
        implements KsYgJctService {

    @Value("${minefile.uploaddirdisc}")
    private String filePath;

    @Value("${minefile.prexypathaccess}")
    private String imgUrl;

    private final KsJbxxhzMapper ksJbxxhzMapper;

    private final KsYgJctMapper jgKsYgJctMapper;

    public KsYgJctImpl(KsJbxxhzMapper ksJbxxhzMapper, KsYgJctMapper jgKsYgJctMapper) {
        this.ksJbxxhzMapper = ksJbxxhzMapper;
        this.jgKsYgJctMapper = jgKsYgJctMapper;
    }


    /**
     * 获取遥感监测图
     *
     * @author 郭梓强
     * @since  2024年5月28日09:00:43
     */
    @Override
    public List<KsYgJctReturnVo> selJgKsFile(KsYgJctRequestParam ksYgJctRequestParam) {

        List<KsYgJct> jgKsYgJcts = jgKsYgJctMapper.selectList(Wrappers.<KsYgJct>lambdaQuery()

                // lambdaQuery 构建查询条件
                .eq(!StringUtil.isNullOrEmpty(ksYgJctRequestParam.getXkzh()), KsYgJct::getXkzh, ksYgJctRequestParam.getXkzh())//许可证号
                .like(!StringUtil.isNullOrEmpty(ksYgJctRequestParam.getNy()), KsYgJct::getNy, ksYgJctRequestParam.getNy())//根据年月查询
        );
        return  BeanUtil.copyToList(jgKsYgJcts, KsYgJctReturnVo.class);
    }


    /**
     * 上传遥感检测图
     *
     * @author 郭梓强
     * @since  2024年5月28日09:02:50
     */
    @Override
    public String jgJgKsYgJct(KsFileDtoParam ksFileDtoParam, HttpServletRequest request) throws IOException {
        // 格式化日期
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd");
        // 获取上传的文件
        MultipartFile file = ksFileDtoParam.getFile();
        // 格式化当前日期和时间
        String div = simpleDateFormat.format(new Date());
        // 获取文件扩展名
        String extension = FileUploadUtils.getExtension(file);
        // 创建一个表示目录路径的File对象
        File pathName = new File(filePath + "/" + div);
        // 检查目录是否不存在，不存在则创建目录及其必要的父目录
        if (!pathName.exists()) {
            pathName.mkdirs();
        }
        // 打印图像保存的位置
        System.out.println("图片上传，保存位置：" + filePath + div);
        String url = null; // 用于保存URL的变量
        // 允许上传的文件扩展名数组
        String[] allowedExtensions = new String[]{".pdf", ".jpeg", ".jpg", ".png"};
        boolean extensionAllowed = false; // 用于标记是否允许上传的标志
        // 遍历允许上传的文件扩展名数组，检查文件扩展名是否匹配
        String flag = null;
        for (String suffix : allowedExtensions) {
            if (("." + extension).equalsIgnoreCase(suffix)) {
                extensionAllowed = true;
                flag = "." + extension;
                break;
            }
        }

        //根据许可证好查询出对应数据
        KsJbxxhz existingRecord = ksJbxxhzMapper.selectOne(
                Wrappers.lambdaQuery(KsJbxxhz.class)
                        .eq(!StringUtil.isNullOrEmpty(ksFileDtoParam.getXkzh()), KsJbxxhz::getXkzh, ksFileDtoParam.getXkzh())//许可证号
        );
        File destinationFile = null;
        String kyqr = null;
        if(! flag.equals(".pdf"))
        {
            // 获取文件扩展名
            extension = FileUploadUtils.getExtension(file);
            // 创建一个表示目录路径的File对象
            pathName = new File(filePath + "/");
            // 检查目录是否不存在，不存在则创建目录及其必要的父目录
            if (!pathName.exists()) {
                pathName.mkdirs();
            }
            // 生成一个唯一的文件名
            String uniqueFileName = UUID.randomUUID().toString().replace("-", "");
            kyqr = existingRecord.getKyqr() + "_" + uniqueFileName + "." + extension;
            // 创建一个表示文件路径的File对象
            //A:/file/yyy-MM-ddXXX公公司（盘路径）
            destinationFile = new File(filePath + kyqr);
            // 将文件传输到指定位置
            file.transferTo(destinationFile);
            url = imgUrl + kyqr;
            System.out.println("图片上传，访问URL：" + url);
        } else {
            // 生成一个唯一的文件名
            String uniqueFileName = UUID.randomUUID().toString().replace("-", "");
            kyqr = existingRecord.getKyqr() + "_" + uniqueFileName + "." + extension;
            // 创建一个表示文件路径的File对象
            //A:/file/yyy-MM-ddXXX公公司（盘路径）
            destinationFile = new File(filePath + div + "/" + kyqr);
            // 将文件传输到指定位置
            file.transferTo(destinationFile);
            // 构造上传文件的URL
            url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/image/" + div +"/"+ kyqr;
        }
        if (existingRecord==null){

            throw new RuntimeException("上传数据丢失从新上传或联系管理员");
        }
        if (extensionAllowed) {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            LoginUser  principal = (LoginUser) authentication.getPrincipal();
            // 获取上传文件的原始文件名
            String originalFileName = file.getOriginalFilename();
            KsYgJct jgKsYgJct = new KsYgJct();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");//创建时间格式
            jgKsYgJct.setXkzh(existingRecord.getXkzh());//许可证号
            String format = dateFormat.format(ksFileDtoParam.getNy());//Date时间类型转换String类型
            jgKsYgJct.setNy(format);//年月
            jgKsYgJct.setWjmc(originalFileName);//文件名称
            jgKsYgJct.setXdlj(url);//相对路径
            jgKsYgJct.setJdlj(String.valueOf(destinationFile));//绝对路径
            jgKsYgJct.setWjlx(extension);//后缀名称
            jgKsYgJct.setWjdx(file.getSize() / 1024 + "KB");//文件大小
            jgKsYgJct.setScr(principal.getUserId());//当前上传人
            jgKsYgJct.setScsj(new Date());//当前时间
            jgKsYgJctMapper.insert(jgKsYgJct);
        }
        return url;
    }

    /**
     * 删除-遥感检测图
     *
     * @author 郭梓强
     * @since  2024年5月28日09:03:46
     */
    @Override
    public boolean delJgKsYgJct(Integer id) {
        int i = jgKsYgJctMapper.deleteById(id);
        return i > 0;
    }
}
